package com.jy.modules.cims.component.sysAssist;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jy.modules.cims.common.sysUtils.BatchInvokeUtils;

/**
 * @classname BatchService
 * @description 批服务实现类
 * @author shengzhoutao
 */
@Service("com.jy.modules.cims.component.sysAssist.BatchService")
public class BatchService {
	@Autowired
	private BatchInvokeUtils batchInvokeUtils;

	/**
	 * @Description 根据参数分批调用执行某个类的方法 <br>
	 *              被执行的方法，例如：<br>
	 *              <code>
	 *              class A{ 
	 *                 public List<T> search(List<String> id, Map<Object, Object>  paramterMap){
	 *                     Object paramter = paramterMap.get("paramter"); 
	 *                     List   result = (List)paramterMap.get("result"); 
	 *                     //操作数据库或调用某方法返回的结果  
	 *                     List<T> list =  get(paramter);
	 *                    
	 *                     return result.add(list);
	 *                  } 
	 *              }</code> <br>
	 *              使用该方法，例如：<br>
	 *              <code>@Autowired</code>
	 *              <code>@Qualifier("com.jy.modules.cims.interact.InteractClassInvokeService")</code>
	 *              <code>private InteractClassInvokeService  interactClassInvokeService;</code>
	 *              <code>
	 *                 List<T> result = new ArrayList<T>();
	 *                 Object[] arry = interactClassInvokeService.batchInvoke(A.class, "search", idList, paramterMap, 500);
	 *                 //方法一： 通过方法获取值
	 *                 List   result = (List)paramterMap.get("result"); 
	 *                 .....
	 *                 
	 *                // 方法二：直接通过返回结果获取值
	 *                if(null != arry){
	 *                   for(int index=0;index<arry.length; index++){
	 *                      List<T> list = (List<T>)arry[index];
	 *                      result = CollectionsUtils.union(result, list);
	 *                      .....
	 *                   }
	 *                }
	 *              </code>
	 * @param executeClass
	 *            执行类
	 * @param executeMethod
	 *            执行方法名，该执行类方法要在类中定义公用<code>public</code>的方法。<br>
	 * @param paramterList
	 *            参数List，将分批处理的参数集合。必输入项，被执行的方法必须有该参数。方法有该参数不能为<code>null</code>。
	 * @param paramterMap
	 *            参数Map，其它参数都可以放到<code>paramterMap</code>处理，
	 *            也可以将返回结果放入此参数传递，在被处理调用的方法处理。非必输入项。如果方法有该参数不能为<code>null</code>，否则忽略参数不存在。
	 * @param batchCount
	 *            每一次执行的条数，正整数，值小于等于1000。
	 * @return 多次执行接口返回结果的数组。如果接口没有返回值，返回将是空；如果接口有返回非空值，返回有值，需要此值需要值做转换。
	 * @author shengzhoutao
	 * @date 2015-5-26
	 */
	public <T> Object[] batchInvoke(final Class<?> executeClass, final String executeMethod, final List<T> paramterList,
			Map<Object, Object> paramterMap, int batchCount) {

		return batchInvokeUtils.batchInvoke(executeClass, executeMethod, paramterList, paramterMap, batchCount);
	}
}
